package com.demo.utils;

import com.demo.utils.mapper.EmpMapper;
import com.demo.utils.modle.Emp;
import com.demo.utils.service.impl.EmpServiceImpl;
import com.sun.javafx.fxml.BeanAdapter;
import org.junit.jupiter.api.Test;
import org.springframework.beans.BeanUtils;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.util.ClassUtils;
import org.springframework.util.ReflectionUtils;

import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Objects;

/**
 * @author ausu
 * @version 1.0
 * @description: TODO  对象属性及反射工具类
 * @date 2023/1/20 22:52
 */
@SpringBootTest
public class ObjectUtil {

    /**
     *  java.util.Objects
     *
     * Objects.isNull(integer);//对象为空
     * Objects.nonNull(integer);//对象不为空
     * Objects.requireNonNull(integer1, "参数不能为空");//对象为空抛异常
     * Objects.equals(integer1, integer2);//判断两个对象是否相等，Objects给我们提供了equals方法
     * Objects.hashCode(str);//获取对象的hashCode
     *
     */
    @Test
    public void te1() {
        Emp emp = new Emp();
        emp.setName("张二").setManager(1).setJob("安卓开发");
        Emp emp1 = new Emp();
        emp1.setName("李四").setManager(1).setJob("java开发");
        int i = Objects.hashCode(emp);
        System.out.println("emp hashCode:"+ i);
        boolean equals = Objects.equals(emp, emp1);
        System.out.println("equals : " + equals);
        boolean aNull = Objects.isNull(emp);
        boolean b = Objects.nonNull(emp);
        System.out.println("isNull result: " + aNull);
        System.out.println("nonNull result: " + b);
    }

    /**
     * org.apache.http.util.EntityUtils
     *
     * toString：把Entity转换为字符串
     * consume：确保Entity中的内容全部被消费。可以看到源码里又一次消费了Entity的内容，假如用户没有消费，那调用Entity时候将会把它消费掉
     * toByteArray：把Entity转换为字节流
     * consumeQuietly：和consume一样，但不抛异常
     * getContentCharset：获取内容的编码
     */
    @Test
    public void te2() {
    }

    /**
     * org.apache.commons.beanutils.PropertyUtils
     *
     * getProperty：获取对象属性值
     * setProperty：设置对象属性值
     * getPropertyDiscriptor：获取属性描述器
     * isReadable：检查属性是否可访问
     * copyProperties：复制属性值，从一个对象到另一个对象
     * getPropertyDiscriptors：获取所有属性描述器
     * isWriteable：检查属性是否可写
     * getPropertyType：获取对象属性类型
     */
    @Test
    public void te3() {

    }

    /**
     * org.apache.commons.beanutils.BeanUtils
     *
     * copyPeoperties：复制属性值，从一个对象到另一个对象
     * getProperty：获取对象属性值
     * setProperty：设置对象属性值
     * populate：根据Map给属性复制
     * copyPeoperty：复制单个值，从一个对象到另一个对象
     * cloneBean：克隆bean实例
     */
    @Test
    public void te4() {

    }

    /**
     * org.springframework.beans.BeanUtils
     *
     * BeanUtils.copyProperties(user1, user2);//拷贝对象的属性
     * BeanUtils.instantiateClass(User.class);//实例化某个类
     * BeanUtils.findDeclaredMethod(User.class, "getId");//获取指定类的指定方法
     * BeanUtils.findPropertyForMethod(declaredMethod);//获取指定方法的参数
     *
     * example:
     * Method declaredMethod = BeanUtils.findDeclaredMethod(User.class, "getId");
     * PropertyDescriptor propertyForMethod = BeanUtils.findPropertyForMethod(declaredMethod);
     * System.out.println(propertyForMethod.getName())
     */
    @Test
    public void te5() {
        Emp emp = new Emp();
        emp.setName("张三三").setManager(1).setJob("安卓开发");
        Emp emp1 = new Emp();
        BeanUtils.copyProperties(emp,emp1);
        System.out.println("emp1:"+emp1.toString());
        System.out.println("emp:"+emp.toString());
        System.out.println("=============");

        Method addEmp = BeanUtils.findDeclaredMethod(EmpServiceImpl.class, "addEmp",Emp.class);
        System.out.println("addEmp: " + addEmp.toString());
        assert addEmp != null;
        PropertyDescriptor property = BeanUtils.findPropertyForMethod(addEmp);
        System.out.println("property: " + property);

    }

    /**
     * org.springframework.util.ClassUtils
     *
     * ClassUtils.getAllInterfaces(new User());//获取对象的所有接口
     * ClassUtils.getPackageName(User.class);//获取某个类的包名
     * ClassUtils.isInnerClass(User.class);//判断某个类是否内部类
     * ClassUtils.isCglibProxy(new User());//判断对象是否代理对象
     */
    @Test
    public void te6() {
        Class<?>[] allInterfaces = ClassUtils.getAllInterfaces(new Emp());
        System.out.println("allInterfaces :"+allInterfaces);
        String packageName = ClassUtils.getPackageName(Emp.class);
        System.out.println("packageName : " + packageName);
        boolean cglibProxy = ClassUtils.isCglibProxy(new Emp());
        System.out.println("cglibProxy : " + cglibProxy);
    }

    /**
     * org.springframework.util.ReflectionUtils
     *
     * Method method = ReflectionUtils.findMethod(User.class, "getId");//获取方法
     * Field field = ReflectionUtils.findField(User.class, "id");//获取字段
     * ReflectionUtils.invokeMethod(method, springContextsUtil.getBean(beanName), param);//执行方法
     * ReflectionUtils.isPublicStaticFinal(field);//判断字段是否常量
     * ReflectionUtils.isEqualsMethod(method);//判断某个方法是否equals方法
     */
    @Test
    public void te7() {
//        Method addEmp = ReflectionUtils.findMethod(EmpServiceImpl.class, "addEmp");
//        System.out.println("addEmp: " + addEmp);
//        Field name = ReflectionUtils.findField(Emp.class, "name");
//        System.out.println("name: " + name);
//        Emp emp = new Emp();
//        emp.setJob("java").setName("lwd");
//        assert addEmp != null;
//        Object invokeMethod = ReflectionUtils.invokeMethod(addEmp, "addEmp",emp);
//        System.out.println("invokeMethod : " + invokeMethod);
    }
}
